package com.zhixi.pattern.important.decoratorpattern;

import com.zhixi.pattern.important.decoratorpattern.operation.AbstractMilkTea;
import com.zhixi.pattern.important.decoratorpattern.operation.concreatecomponent.MilkTea;
import com.zhixi.pattern.important.decoratorpattern.operation.decoratior.Coconut;
import com.zhixi.pattern.important.decoratorpattern.operation.decoratior.Pearl;

/**
 * 装饰模式（特殊的代理模式）
 *
 *  一个接口（AbstractMilkTea），MilkTea（实现类）
 *  正常程序，一个接口，一个实现类，之间new实现类就可以制作奶茶，如果我制作奶茶不同客户有不同需求
 *  比如有的客户加珍珠，有的客户加椰果，有的成年人客户珍珠椰果他都要
 *  这个时候就需要一个装饰类（Decorator）
 *  然后你需要有什么材料就继承这个装饰类就可以了
 *
 *
 *  动态的将新功能附加到对象上。在对象功能扩展方面，它比继承更有弹性，装饰着模式也体现了开闭原则（ocp）
 *
 * @作者 ShuHaoNan
 * @邮箱 shuhaonan1@gmail.com
 * @时间 2020/11/17 14:49
 */
public class DecoratorPattern {

    public static void main(String[] args) {
        AbstractMilkTea milkTea = new MilkTea();
        /* 添加珍珠和椰果 */
        milkTea = new Pearl(milkTea);
        milkTea = new Coconut(milkTea);
        milkTea.startMakeMilkTea();
        milkTea.endMakeMilkTea();
    }

}
